import tkinter as tk
from tkinter import ttk, messagebox
from visualize_prediction import  run_visualization

# 你的可视化函数同之前一致，这里假设你已经定义好了：
# compare_nc_variables, plot_nc_error_map, run_visualization

class VisualizationApp:
    def __init__(self, root):
        self.root = root
        self.root.title("气象预测可视化工具")
        self.root.geometry("480x300")  # 更大的窗口
        self.root.resizable(False, False)

        self.var_names = ["2m_temperature","10m_u_component_of_wind", "10m_v_component_of_wind"]  # 写死变量名

        # 使用 ttk 样式
        self.style = ttk.Style()
        self.style.configure("TLabel", font=("微软雅黑", 13))
        self.style.configure("TButton", font=("微软雅黑", 13), padding=6)
        self.style.configure("TRadiobutton", font=("微软雅黑", 13))

        main_frame = ttk.Frame(root, padding=30)
        main_frame.pack(expand=True)

        ttk.Label(main_frame, text="气象预测可视化", font=("微软雅黑", 16, "bold")).grid(row=0, column=0, columnspan=2, pady=10)

        # 时间索引输入
        ttk.Label(main_frame, text="时间索引 (0-90):").grid(row=1, column=0, sticky="e", pady=10)
        self.time_entry = ttk.Entry(main_frame, font=("微软雅黑", 13), width=10)
        self.time_entry.insert(0, "0")
        self.time_entry.grid(row=1, column=1, sticky="w")

        # 模式选择
        ttk.Label(main_frame, text="可视化模式:").grid(row=2, column=0, sticky="e", pady=10)
        self.mode_var = tk.StringVar(value="compare")
        mode_frame = ttk.Frame(main_frame)
        mode_frame.grid(row=2, column=1, sticky="w")
        ttk.Radiobutton(mode_frame, text="Compare", variable=self.mode_var, value="compare").pack(side="left", padx=10)
        ttk.Radiobutton(mode_frame, text="Error", variable=self.mode_var, value="error").pack(side="left", padx=10)

        # 运行按钮
        self.run_btn = ttk.Button(main_frame, text="开始可视化", command=self.run)
        self.run_btn.grid(row=3, column=0, columnspan=2, pady=20)

    def run(self):
        try:
            time_idx = int(self.time_entry.get())
            # pred_time_idx = int(self.time_entry.get())+19 #这是给长度为6用的 此时config当中为15日至19日
            pred_time_idx = int(self.time_entry.get()) #这是给长度为48用的 此时config当中为14日至19日
            # pred_time_idx = int(self.time_entry.get()) #这是给长度为24用的 此时config当中为15日至19日
            pan_time_idx = int(self.time_entry.get())
            if not (0 <= time_idx <= 90):
                messagebox.showerror("错误", "时间索引必须在 0 到 90 之间")
                return
        except ValueError:
            messagebox.showerror("错误", "时间索引必须是整数")
            return

        # 构造文件路径
        idx_str = f"{time_idx:03d}"
        pred_idx_str = f"{pred_time_idx:03d}"
        pan_idx_str = f"{pan_time_idx:03d}"
        obs_path = f"obs/obs_{idx_str}.nc"
        # pred_path = f"results_for_6/pred_{pred_idx_str}.nc"
        # pred_path = f"results_for_24/pred_{pred_idx_str}.nc"
        pred_path = f"results_for_48/pred_{pred_idx_str}.nc"
        pangu_path = f"panguresults/pgpred_{idx_str}.nc"

        mode = self.mode_var.get()

        try:
            run_visualization(pred_path, obs_path, self.var_names, time_idx=0, mode=mode, pangu_path=pangu_path)
        except Exception as e:
            messagebox.showerror("运行错误", str(e))


if __name__ == "__main__":
    root = tk.Tk()
    app = VisualizationApp(root)
    root.mainloop()
